#include "../head/server.h"

int main(int argc, char *argv[])
{
	// ./server ip 端口号 子线程数目
	// ARGS_CHECK(argc, 4);

	// 从配置文件中加载服务器ip
	char ip[100] = {0};
	getparameter("ip", ip); // getparameter.c
	printf("ip: %s\n", ip);
	// 从配置文件中加载服务器端口
	char port[100] = {0};
	getparameter("port", port); // getparameter.c
	printf("port: %s\n", port);
	// 从配置文件中加载子线程数量
	char threadNum[100] = {0};
	getparameter("threadNum", threadNum); // getparameter.c
	printf("threadNum: %s\n", threadNum);

	threadPool_t threadPool;
	// 初始化线程池和任务队列
	initThreadPool(&threadPool, atoi(threadNum)); // initThreadPool.c

	int socket_fd;
	// 初始化socket连接
	initTcpSocket(&socket_fd, ip, port);
	printf("成功建立tcp连接！\n");

	int epoll_fd = epoll_create(1);
	// 添加socket_fd到epoll
	epollAddFD(epoll_fd, socket_fd);

	// 用来获取客户端的地址信息
	struct sockaddr_in clientAddr;
	// 客户端地址信息结构体大小
	socklen_t clientAddrLength = sizeof(clientAddr);
	
	struct epoll_event readyset[1024];
	while (1)
	{
		int readynum = epoll_wait(epoll_fd, readyset, 1024, -1);
		for (int i = 0; i < readynum; ++i)
		{
			if (readyset[i].data.fd == socket_fd)
			{
				int net_fd = accept(socket_fd, (struct sockaddr *)&clientAddr, &clientAddrLength);
				NETDISK_LOG_INFO(net_fd, clientAddr);
				pthread_mutex_lock(&threadPool.taskQueue.mutex);
				enQueue(&threadPool.taskQueue, net_fd);
				pthread_cond_signal(&threadPool.taskQueue.cond);
				pthread_mutex_unlock(&threadPool.taskQueue.mutex);
			}
		}
	}

	close(epoll_fd);
	close(socket_fd);

	return 0;
}